
#include <stm32f10x.h>
#include <stdbool.h>
#include <stdio.h>

static unsigned char code_table[] = {
    0xc0, // 0
    0xf9, // 1
    0xa4, // 2
    0xb0, // 3
    0x99, // 4
    0x92, // 5
    0x82, // 6
    0xf8, // 7
    0x80, // 8
    0x90, // 9
    0x88, // A
    0x83, // B
    0xc6, // C
    0xa1, // D
    0x86, // E
    0x8e, // F
    0x8c, // P
    0xc1, // U
    0x91, // Y
    0x7c, // L
    0x00, // ȫ��
    0xff  // Ϩ��
};

void delay_ms(unsigned int ms)
{
    int i = 0;
    while (ms--)
    {
        for (i = 0; i < 1000; i++)
            ;
    }
}

void init_gpio_a_b()
{
    GPIO_InitTypeDef def;

    def.GPIO_Mode = GPIO_Mode_Out_PP;
    def.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    def.GPIO_Speed = GPIO_Speed_50MHz;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_Init(GPIOA, &def);

    def.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_Init(GPIOB, &def);

    // input key
    def.GPIO_Mode = GPIO_Mode_IPU;
    def.GPIO_Pin = GPIO_Pin_8;
    GPIO_Init(GPIOA, &def);
}

void show_any_4num(int num)
{

    GPIO_Write(GPIOB, 0x1);
    GPIO_Write(GPIOA, code_table[num / 1000 % 10]);
    delay_ms(10);
    GPIO_Write(GPIOB, 0);
    GPIO_Write(GPIOB, 0x2);
    GPIO_Write(GPIOA, code_table[num / 100 % 10]);
    delay_ms(10);
    GPIO_Write(GPIOB, 0);
    GPIO_Write(GPIOB, 0x4);
    GPIO_Write(GPIOA, code_table[num / 10 % 10]);
    delay_ms(10);
    GPIO_Write(GPIOB, 0);
    GPIO_Write(GPIOB, 0x8);
    GPIO_Write(GPIOA, code_table[num % 10]);
    delay_ms(10);
    GPIO_Write(GPIOB, 0);
}

uint8_t read_key()
{
    return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);
}

int main()
{

    int counter = 0;
    printf("start display!");

    init_gpio_a_b();

    while (true)
    {

        if (!read_key())
        {
            delay_ms(10); // 消抖
            if (!read_key())
            {
                do
                {
                    delay_ms(1);
                } while (!read_key());
                counter++;
            }
        }
        show_any_4num(counter);
    }

    return 0;
}
